﻿using System.Collections.Generic;

namespace Teal.Compiler {

    /// <summary>
    /// 表示一个列表对象池。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public static class ListObjectPool<T> {

        static List<T>[] _data = new List<T>[128];
        static int _length;

        /// <summary>
        /// 从对象池申请一个新的列表对象。
        /// </summary>
        /// <param name="capicity">列表对象的初始大小。</param>
        /// <returns></returns>
        public static List<T> alloc(int capicity = 2) {
            if (_length == 0) {
                return new List<T>(capicity);
            }
            var result = _data[_length--];
            result.Capacity = capicity;
            return result;
        }

        /// <summary>
        /// 将指定的列表对象重新放入对象池以重用。
        /// </summary>
        /// <param name="value">要对象的列表对象。</param>
        public static void free(List<T> value) {

            // 不缓存大数据。
            if (value.Count > 128) {
                return;
            }
            if (_length < _data.Length) {
                value.Clear();
                _data[++_length] = value;
            }
        }

    }

}
